Legend:
    - Bug fix
    + New feature
    * Changes
    ! Important

2025-03-18  __vic
    + Config library

2025-02-25  __vic
    + ip_addr.h:
        + ipv4_addr
        + ipv6_addr

2024-11-24  __vic
    + str2num.h: parse_decimal()
    + __VIC_FALLTHROUGH

2024-11-08  __vic
    + sreaders: uchar_value()

2024-10-25  __vic
    + type_traits.h: is_byte, byte_cast()

2024-10-23  __vic
    + sreader concept
    + swriter concept

2024-10-15  __vic
    ! sreaders use regular return for the value instead of the output parameter

2024-10-03  __vic
    ! Renamed reader -> sreader
    ! Renamed writer -> swriter
    ! swriter: renamed write -> operator()
    ! sreader: renamed read -> operator()

2024-06-27  __vic
    * to_text_append() is a generic value to text converter.
    * logger:
        ! to_text_append() is used by default instead of
          operator<<(string_buffer)
        + log_value::to_text()
    ! string_buffer: to_text_append() is to be overloaded instead of
      operator<<(string_buffer)

2024-06-06  __vic
    ! Renamed fixed_vector -> bounded_vector

2024-05-31  __vic
    - to_text.h: Renamed to_text(unsigned char, ...) -> to_text_append

2024-03-05  __vic
    + logger: std::format support

2024-02-27  __vic
    * ascii.h: protection from isascii() macro
    * readonly_cstring: duplicated code removed

2024-02-16  __vic
    * type_traits.h:
        + conditional
        + conjunction, disjunction, negation

2023-10-20  __vic
    + __VIC_INLINE_CONSTEXPR_VAR
    - __VIC_SWAP_HEADER definition was invalid

2023-10-06  __vic
    + C++23 mode support
    * C++17 is used by default
    * Intel C++ compiler support removed

2023-04-07  __vic
    + __VIC_IF_CONSTEVAL

2022-03-02  __vic
    - readonly_cstring: compare(const char *,readonly_cstring)

2022-02-21  __vic
    * throw_errno: it's enough to override only one function

2022-02-11  __vic
    * logger: fields layout reorganized to be more compact

2022-02-09  __vic
    + string_buffer: operator<<(string_buffer &&, T)

2021-12-07  __vic
    + string_ref: conversion from/to std::string_view
    + string_buffer supports std::string_view (via string_ref)
    * ascii::equal_icase() uses std::string_view if available

2021-12-06  __vic
    * string_utils.h:
        * starts_with(), ends_with() use std::string_view if available
        * trimmed()-functions use std::string_view if available

2021-12-03  __vic
    * logger:
        * use std::string_view if available
        + to_string_view(logger::severity)
    * str2num.h:
        + use [[nodiscard]]
        * use std::string_view if available

2021-11-19  __vic
    * type_traits.h: using std::remove_cvref in C++20 mode

2021-10-13  __vic
    * bits.h: msb_ones(), lsb_ones(), get_lsbs() are constexpr now

2021-10-04  __vic
    + memory.h: store_unaligned()

2021-06-11  __vic
    + logger: notice level

2021-06-07  __vic
    * posix::dir_entries: use readdir() instead of deprecated readdir_r()

2021-05-03  __vic
    - bits.h: __VIC_ASSERT_UINT() in C++98 mode
    + algorithm.h:
        + skip_if_front(), skip_if_back()
    * skip_if_{front,back}() are used inside trim-functions

2021-04-30  __vic
    * sift() uses set_of_chars

2020-12-22  __vic
    + ascii.h: isblank(), isprint(), isgraph(), ispunct(), iscntrl()

2020-12-16  __vic
    + base16.h: base16::encode_byte_{lower|upper}()

2020-11-30  __vic
    * Use std::uncaught_exceptions() instead of deprecated
      std::uncaught_exception() when possible

2020-05-25  __vic
    * bits.h: MSVC++ __popcnt() can cause crash if not supported by CPU so
      isn't used by default. Define __VIC_POPCNT to use it

2020-02-24  __vic
    ! string_utils.h: Renamed:
        ! trim_left() -> trim_front()
        ! trim_right() -> trim_back()
        ! trimmed_left() -> trimmed_front()
        ! trimmed_right() -> trimmed_back()
        ! pad_left() -> pad_front()
        ! pad_right() -> pad_back()

2020-02-17  __vic
    * posix::ovectors:
        ! Renamed add() -> push_back()
        + pop_back(), empty(), full(), clear()

2020-02-12  __vic
    * Repeated errno reads are minimized

2020-02-10  __vic
    * memory.h: load_unaligned(): fallback to std::memcpy() if no better
      alternatives
    ! Renamed object_pool -> fixed_vector

2020-01-28  __vic
    + throw_errno.h and throw_errno() are parts of the public API now
    ! defs.h: uninitialized/noinit removed

2020-01-14  __vic
    - posix_pidfile.cpp: write_pid(): results of all syscalls are checked now

2019-12-24  __vic
    * logger: severity strings moved to the own object file

2019-12-19  __vic
    - str2num.h: signed_decimal_parser: out of buffer access if input string
      is "+" or "-"

2019-10-21  __vic
    + Support for compilers without any form of 64-bit integers (long long)

2019-07-18  __vic
    ! posix::dir_entries, posix::dir_files don't throw on open any more.
      Explicit is_open() check is required now!

2019-07-02  __vic
    - string_utils.h: sift_if(): redundant past the end predicate check

2019-06-26  __vic
    + Workaround for Clang 3.9+ issue - __has_cpp_attribute(nodiscard) returns
      1 even when used mode is C++14 or less

2019-06-21  __vic
    - "__VIC_NO_BUITLINS" was used instead of __VIC_NO_BUILTINS
    + test/bits_no_biltins.cpp
    + test/endian_no_builtins.cpp

2019-05-31  __vic
    + bits.h: ceil_log2(), floor_log2()

2019-05-22  __vic
    * bits.h:
        + ceil2(), floor2(), ispow2(), msb_position()
        * rotl()/rotr() use language types instead of cstdint typedefs

2019-05-21  __vic
    * Renamed __VIC_NO_GCC_BUITLINS -> __VIC_NO_BUITLINS
    + bits.h: popcount()

2019-04-18  __vic
    + posix/pidfile.h:
        + posix::pidfile
    + posix/daemon_control.h:
        + posix::daemon_control

2019-04-01  __vic
    * logger:
        + shrink_buffer()
        ! No autoshrink

2019-03-25  __vic
    - bits.h: UB on rot{l|r}(..., 0)

2019-03-13  __vic
    + memory.h:
        + load_unaligned()

2019-03-12  __vic
    + [[nodiscard]] support
    + endian.h: endian::to/from_big/little()

2019-02-18  __vic
    * posix/sigset.h: posix::sigset:
        + Constructor and assignment from array
        + assign()
    * posix/thread.h:
        + posix::this_thread::sigwait_at_most()
        + posix::this_thread::sigwaitinfo_at_most()

2019-02-13  __vic
    + endian.h:
        + endian
        + swab16(), swab32(), swab64()

2019-02-08  __vic
    + tchar.h: tchar::empty(), tchar::equal()

2019-02-05  __vic
    + doc: russian translation

2019-01-31  __vic
    * object_pool: renamed push() -> push_allocated()

2018-12-17  __vic
    + writers/null.h:
        + null_writer

2018-11-20  __vic
    * base64::decode(): no whitespaces skip

2018-11-14  __vic
    * stdio_file:
        * Renamed attach() -> attach_handle(), detach() -> detach_handle()
        + attach_handle() returns old value
    * posix::file:
        * Renamed attach() -> attach_handle(), detach() -> detach_handle()
        + attach_handle() returns old value

2018-10-30  __vic
    + Handmade integers to text converters (to_text_append())

2018-10-24  __vic
    * Underlying type is specified for logger::severity

2018-10-08  __vic
    + readers, writers: make_...()
    + utf{8|16}: make_reader(), make_writer()
    + unicode.h: utf_transcode()
    + writers/iterator.h:
        + iterator_writer

2018-09-28  __vic
    + utf16/defs.h:
        + utf16::code_unit_t
    + utf16/status.h:
        + utf16::status
        + utf16::is_error(), utf16::throw_if_error()
    + utf16/exceptions.h:
        + utf16::bad_encoding and derivatives
    + utf16/reader.h:
        + utf16::reader
    + utf16/writer.h:
        + utf16::writer

2018-09-27  __vic
    + unicode.h:
        + unicode_t
        + unicode_max, unicode_bom, unicode_replacement_char
    + utf8/defs.h:
        + utf8::is_continuation_byte()
    + utf8/status.h:
        + utf8::status
        + utf8::is_error(), utf8::throw_if_error()
    + utf8/exceptions.h:
        + utf8::bad_encoding and derivatives
    + utf8/reader.h:
        + utf8::reader
    + utf8/writer.h:
        + utf8::writer

2018-09-26  __vic
    * Readers:
        * Renamed range_reader[_n] -> iterator_reader[_n]
        * basic_string_reader is implemented using raw pointer +
          iterator_reader_n
        + position() function for memory readers

2018-09-19  __vic
    * defs.h: unitialized can't be constructed using just {}
    * logger:
        * Renamed accepts_*() -> *_visible()
        + class output
        + settings_t

2018-09-18  __vic
    + C++14 and C++17 modes support
    + set_of_chars: C++14 constexpr

2018-09-03  __vic
    * doc: make https://validator.w3.org/ happy
    * base16, base64: try_decode() added

2018-08-09  __vic
    * str2num.h: to_errno(number_parse_status) removed

2018-07-11  __vic
    + bmake makefile for FreeBSD 10+

2018-06-21  __vic
    * LLVM libc++ defines nullptr macro in C++98 mode

2018-06-06  __vic
    + __VIC_SCOPED_ENUM_BEGIN/END
    * logger: renamed message_severity -> severity_t
    + str2num.h: number_parse_status

2018-06-05  __vic
    * string_ref.h: basic_string_ref: operator== uses memcmp()

2018-05-21  __vic
    + doc: stable links for chapters
    * Renamed meta.h -> type_traits.h

2018-05-15  __vic
    * doc/document.dtd is deterministic now

2018-05-14  __vic
    + object_pool: full()

2018-05-07  __vic
    * Don't catch exceptions by value even in tests

2018-03-28  __vic
    * bits.h: lo/hi_nibble() return uint8_t instead of int

2018-01-26  __vic
    + Tests for readers
    + Tests for writers
    - readers/cstring.h: invalid code

2017-12-26  __vic
    + meta.h: index_sequence, make_index_sequence

2017-12-21  __vic
    + packon.h, packoff.h

2017-12-14  __vic
    + posix/sigset.h:
        * posix::sigset moved from posix/signal.h
    * posix/process.h: posix::ignore_signals() moved from posix/signal.h
    * posix/signal.h removed

2017-12-13  __vic
    * doc/html.xsl: more tolerant to retarded XSLT processors (oracle) TOC
      generation code
    + posix/process.h: posix::process_alive()

2017-12-12  __vic
    + waitable_event for C++98 mode too
    + thread.h:
        + thread
        + this_thread
            + get_id()
            + sleep_ms()
    + mutex.h:
        + mutex
        + mutex_lock

2017-12-08  __vic
    * meta.h:
        + remove_reference, remove_cvref
        + Template aliases for type transformers
    + waitable_event.h:
        + waitable_event for C++11 mode only

2017-12-07  __vic
    + GNU Make makefiles

2017-12-06  __vic
    * Classes with constexpr constructor don't inherit non_copyable

2017-12-05  __vic
    * posix/time.h: posix::time_spec: renamed mksec -> usec

2017-12-05  __vic
    * string_buffer can be compiled even when old compatible ABI is used by
      GNU libstdc++
    + Intel C++ 17.0+ compiler support

2017-11-28  __vic
    + string_utils.h: starts_with(), ends_with()

2017-11-14  __vic
    * to_text_append():
        - Small buffer for 8-byte long types
        - printf() "ll" length modifier is not always available
        * Using snprint() in C++11 mode

2017-09-21  __vic
    + posix/mutex.h:
        * posix::mutex, posix::mutex_lock moved from posix/thread.h
    + posix/cond_variable.h
        * posix::cond_variable moved from posix/thread.h

2017-09-21  __vic
    * ascii.h:
        * Moved from bits.h:
            * to_hex_digit_upper() -> ascii::toxdigit_upper()
            * to_hex_digit_lower() -> ascii::toxdigit_lower()
            * hex_to_number() -> ascii::xdigit_to_number()
        + ascii::todigit()
        + ascii::digit_to_number()

2017-09-18  __vic
    * Renamed io.h -> stdio_file.h

2017-09-14  __vic
    * readers.h removed. All content moved to:
        + readers/range.h (range_reader, range_reader_n)
        + readers/container.h (container_reader)
        + readers/cstring.h (basic_cstring_reader, cstring_reader)
    * writers.h removed. All content moved to:
        + writers/push_back.h (push_back_writer)
    * string_utils.h:
        * string_reader moved to:
            + readers/string.h
        * string_writer moved to:
            + writers/string.h
    * io.h:
        * cstream_reader moved to:
            + readers/cstream.h
        * cstream_writer moved to:
            + writers/cstream.h
        + read(std::FILE *, unsigned char &)
    + readers/cstream.h: cstream_reader: read(unsigned char &)
    * readers/cstring.h:
        + basic_cstring_reader<char>: read(unsigned char &)
    * readers/string.h:
        + basic_string_reader
        + basic_string_reader<char>: read(unsigned char &)
    * writers/string.h:
        + basic_string_writer

2017-06-30  __vic
    * Renamed string_ops.h -> string_utils.h
    * Renamed static_string -> readonly_cstring

2017-02-21  __vic
    * fs.h: file_size(): uintmax_t is used as a return type

2017-01-31  __vic
    * str2num.h: std::strchr(s,0) returns non-const pointer on MinGW so
      tchar::end(s) is used instead

2017-01-30  __vic
    + readers.h:
        + range_reader
        + range_reader_n
        + container_reader
        + basic_cstring_reader, cstring_reader
    + writers.h:
        + push_back_writer
    * string_ops.h:
        + string_reader
        + string_writer
    * base16.h: base16: uses readers and writers
    * base64.h: base64: uses readers and writers
    * io.h:
        + read(std::FILE *, char &)
        + write(std::FILE *, char)
        + cstream_reader
        + cstream_writer

2017-01-23  __vic
    - str2num.h: C++98 mode
    + iterator.h:
        + begin(T[]), end(T[]), cbegin(T[]), cend(T[])
        + advance(), next(), prev()

2017-01-20  __vic
    + bin_file.h
        + bin_file
    + str2num.h: decimal_parser
    + base16.h:
        + base16::encode_lower(), base16::encode_upper(), base16::decode()
    + base64.h:
        + base64::encode(), base64::decode()
        + base64::encoded_length(), base64::max_decoded_length()

2017-01-18  __vic
    + fs.h:
        + path_exists(), file_exists(), dir_exists()
        + mkdir(), mkdir_if_absent()
        + rmdir(), rmdir_if_exists()
        + get_current_dir()
        + remove_file(), remove_file_if_exists(), remove_file_nt()
        + copy_file(), copy_file_if_exists(), copy_file_replace(),
          copy_file_replace_if_exists()
        + move_file(), move_file_if_exists(), move_file_replace(),
          move_file_replace_if_exists()
        + rename_file(), rename_file_if_exists(), rename_file_replace(),
          rename_file_replace_if_exists()
        + file_size()

2017-01-17  __vic
    + posix/fs.h:
        + posix::dirname(), posix::basename()
        + posix::append_dirname(), posix::append_basename()
        + posix::add_trailing_slash(), posix::with_trailing_slash()

2017-01-16  __vic
    * throw_errno() moved: error.h -> throw_errno.h
    * stdio_file: errno value is thrown in case of error

2017-01-13  __vic
    + str2num.h
        + decimal_to_number()
        + decimal_to_number_range()

2017-01-12  __vic
    + meta.h:
        + integral_constant, true_type, false_type
        + is_same, is_const
        + remove_const, remove_volatile, remove_cv
        + remove_pointer
        + is_signed_integer, is_unsigned_integer
        + enable_if, disable_if
    + set_of_chars.h:
        + set_of_chars

2017-01-11  __vic
    + posix/time.h:
        + posix::time_spec
        + posix::nanoseconds_since_epoch()
        + posix::realtime_clock, posix::monotonic_clock
    + posix/thread.h: posix::cond_variable: wait_for()

2017-01-10  __vic
    * posix/thread.h:
        + posix::mutex, posix::mutex_lock
        + posix::cond_variable

2017-01-09  __vic
    * Renamed trim.h -> string_ops.h
    * string_ops.h:
        + pad_left(), pad_right()
        * sift() treats nullptr as an empty string
    + ascii_string.h:
        + toupper(), tolower() for strings
        + equal_icase() for strings

2016-12-30  __vic
    + ascii.h:
        + isdigit(), isxdigit(), isalpha(), isalnum(), isspace(), isascii()
        + islower(), isupper()
        + tolower(), toupper(), upper_to_lower(), lower_to_upper()
        + equal_icase(char,char)
    + date_time.h:
        + is_leap_year()
        + days_in_month()
        + days_between_years()
        + validate_date(), validate_time(), validate_date_time()

2016-12-29  __vic
    + stdint.h:
        + [u]int<N>_t, [u]int_least<N>_t, [u]int_fast<N>_t, [u]intmax_t,
          [u]intptr_t
        + int_exactly_bytes<>, uint_exactly_bytes<>
    + bits.h:
        + lo_nibble(), hi_nibble()
        + msb_ones(), lsb_ones()
        + get_lsbs()
        + ord()
        + to_hex_digit_upper(), to_hex_digit_lower()
        + hex_to_number()
        + swapped_nibbles()
        + rotl(), rotr()

2016-12-28  __vic
    + string_buffer: move constructor for std::string
    + logger.h:
        + logger

2016-12-27  __vic
    + posix/process.h:
        + posix::daemon()
    + posix/signal.h:
        + posix::sigset
        + posix::ignore_signals()
    + posix/thread.h:
        + posix::this_thread:
            + sigwait(), sigwaitinfo()
            + block_signals(), unblock_signals(), set_sigmask()
    + posix/dir_entries.h:
        + posix::dir_entries
    + posix/dir_files.h:
        + posix::dir_files
    + posix/iov.h:
        + posix::ovectors
        + posix::total(iovec[])
        + posix::cut_prefix(iovec[])
        + posix::writev_all()

2016-12-26  __vic
    + string_ref.h:
        + basic_string_ref (string_ref)
    + string_buffer: string_ref support
    + trim.h:
        + trim(), trimmed(), trim_left(), ...
        + sift(), sift_if()

2016-12-23  __vic
    + io.h:
        + stdio_file
        + getline()
    + object_pool.h:
        + object_pool
    + tchar.h

2016-12-22  __vic
    + to_text.h:
        + to_text_append()
    + string_buffer.h:
        + string_buffer
    + posix/error.h:
        + is_ENOENT(), is_EAGAIN()
    + posix/file.h:
        + posix::file
    + posix/file_stat.h:
        + posix::file_stat

2016-12-21  __vic
    + defs.h:
        + nullptr
        + non_copyable
        + non_heap_allocatable
        + array_size()
    + static_string.h:
        + static_string
    + error.h:
        + exception
        + libc_error
        + throw_errno()

2016-06-23  __vic
    * Total revision and rework started in order to publish the code


VERSION 0.6

2011-05-17  __vic
    * The last internal release before rework (no distribution)


VERSION 0.5.1

2010-09-08  __vic
    * The last released version before rework

2007-08-15  __vic
    * The project is started
